// 开闭原则
package main

import "fmt"

// AbstractBanker 抽象类，写一个方法
type AbstractBanker interface {
	DoBusy()
}

// SaveBanker 具体类，通过实现抽象类的方法来继承抽象类
type SaveBanker struct {
	// AbstractBanker
}

func (sb *SaveBanker) DoBusy() {
	fmt.Println("进行了存款...")
}

// TransferBanker 具体类，通过实现抽象类的方法来继承抽象类
type TransferBanker struct {
	// AbstractBanker
}

func (tb *TransferBanker) DoBusy() {
	fmt.Println("进行了转账...")
}

// BankerBusiness 实现一个架构层，（基于抽象层进行业务封装-针对interface接口进行封装）
func BankerBusiness(banker AbstractBanker) {
	// 通过接口向下来调用（多态）
	banker.DoBusy()
}

func main() {
	//// 存款的业务
	//var sb SaveBanker
	//sb.DoBusy()
	//
	//// 转账的业务
	//tb := TransferBanker{}
	//tb.DoBusy()

	BankerBusiness(&SaveBanker{})
	BankerBusiness(&TransferBanker{})
}
